#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
#include <stdlib.h>

// 读线程：模拟从MP3文件读取数据
void *read(void *arg)
{
    for (int i = 1; i <= 3; i++)
    {
        printf("【读线程】第%d次读取MP3音频数据...\n", i);
        sleep(1); // 模拟读取延迟
    }
    pthread_exit(NULL); // 线程退出
}

// 解压线程：模拟对读取的数据进行解压缩
void *decompress(void *arg)
{
    for (int i = 1; i <= 3; i++)
    {
        printf("【解压线程】第%d次解压缩音频数据...\n", i);
        sleep(1); // 模拟解压延迟
    }
    pthread_exit(NULL);
}

// 播放线程：模拟播放解压缩后的音频数据
void *play(void *arg)
{
    for (int i = 1; i <= 3; i++)
    {
        printf("【播放线程】第%d次播放解压后的音频数据...\n", i);
        sleep(1); // 模拟播放延迟
    }
    pthread_exit(NULL);
}

int main()
{
    pthread_t read_thread, decompress_thread, play_thread; // 线程标识变量
    int ret;

    // 创建读线程
    ret = pthread_create(&read_thread, NULL, read, NULL);
    if (ret != 0)
    {
        perror("创建读线程失败");
        exit(1);
    }

    // 创建解压线程
    ret = pthread_create(&decompress_thread, NULL, decompress, NULL);
    if (ret != 0)
    {
        perror("创建解压线程失败");
        exit(1);
    }

    // 创建播放线程
    ret = pthread_create(&play_thread, NULL, play, NULL);
    if (ret != 0)
    {
        perror("创建播放线程失败");
        exit(1);
    }

    // 主线程阻塞等待三个子线程执行完毕
    pthread_join(read_thread, NULL);
    pthread_join(decompress_thread, NULL);
    pthread_join(play_thread, NULL);

    printf("\n所有线程执行完毕，MP3模拟播放结束！\n");
    return 0;
}